// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_CAST_NET_RTP_PACKET_STORAGE_H_
#define MEDIA_CAST_NET_RTP_PACKET_STORAGE_H_

#include <stddef.h>
#include <stdint.h>

#include <deque>

#include "base/macros.h"
#include "media/cast/net/pacing/paced_sender.h"

namespace media {
namespace cast {

    class PacketStorage {
    public:
        PacketStorage();
        virtual ~PacketStorage();

        // Store all of the packets for a frame.
        void StoreFrame(FrameId frame_id, const SendPacketVector& packets);

        // Release all of the packets for a frame.
        void ReleaseFrame(FrameId frame_id);

        // Returns a list of packets for a frame, or nullptr if not found.
        SendPacketVector* GetFramePackets(FrameId frame_id);

        // Get the number of stored frames.
        size_t GetNumberOfStoredFrames() const;

    private:
        std::deque<SendPacketVector> frames_;
        FrameId first_frame_id_in_list_;

        // The number of frames whose packets have been released, but the entry in the
        // |frames_| queue has not yet been popped.
        size_t zombie_count_;

        DISALLOW_COPY_AND_ASSIGN(PacketStorage);
    };

} // namespace cast
} // namespace media

#endif // MEDIA_CAST_NET_RTP_PACKET_STORAGE_H_
